package com.github.cyf.config.satoken;

import cn.dev33.satoken.fun.SaParamFunction;
import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.stp.StpUtil;
import com.github.cyf.security.SecurityUtil;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 权限拦截器
 * @author chenyifan
 * @create 2024-10-28 10:06
 */
@Component
public class PermissionInterceptor extends SaInterceptor {

    /**
     * 创建一个 Sa-Token 综合拦截器，默认带有注解鉴权能力
     * 源码大致流程：进行权限校验时会先获取 token，然后根据 token 找到对应的 loginId
     *   1）没有找到会抛出异常
     *   2）找到了会调用 StpInterface 的 getPermissionList 或 getRoleList，根据当前用户的角色或权限进行校验
     *
     * 这里相当于做了 token 拦截，没 token 的就不会成功
     */
    public PermissionInterceptor() {
    }

    /**
     * 创建一个 Sa-Token 综合拦截器，默认带有注解鉴权能力
     *
     * @param auth 认证函数，每次请求执行
     */
    public PermissionInterceptor(SaParamFunction<Object> auth) {
        this.auth = auth;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 超级管理员不需要校验
        if (SecurityUtil.isSuperAdmin(StpUtil.getLoginIdAsLong())) {
            return true;
        }
        return super.preHandle(request, response, handler);
    }
}